package Reflect_package1;

import java.lang.reflect.Field;

public class Reflect_demo3 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
        /*
            Class类中用于获取成员变量的方法
                Field[] getFields ()                    返回所有公共成员变量对象的数组
                Field[] getDeclaredFields ()            返回所有成员变量对象的数组
                Field getField (String name)            返回单个公共成员变量对象
                Field getDeclaredField (String name)    返回单个成员变量对象

            Field类中用于创建对象的方法：
                void set (Object obj, Object value)     赋值
                Object get (Object obj)                 获取值
         */

        //1、获取class字节码文件的对象
        Class<?> clazz = Class.forName("Reflect_package1.Student");

        //2、获取public成员变量
        Field[] fields = clazz.getFields();

        for (Field field : fields) {
            System.out.println(field);
        }
        System.out.println("=========================");

        //3、获取所有的成员变量
        Field[] fields2 = clazz.getDeclaredFields();
        for (Field field : fields2) {
            System.out.println(field);
        }
        System.out.println("=========================");

        //获取单个成员变量
        Field g = clazz.getField("gender");
        System.out.println(g);
        System.out.println("=========================");

        //获取权限修饰符
        int modifiers = g.getModifiers();
        System.out.println(modifiers);

        //获取成员变量名
        String ge = g.getName();
        System.out.println(ge);

        //获取成员变量的数据类型
        Class<?> type = g.getType();
        System.out.println(type);
        System.out.println("=========================");

        //获取成员变量记录的值
        Student s = new Student("zhangsan", 23, "男");
        Field name = clazz.getDeclaredField("name");//获取成员变量
        name.setAccessible(true);//取消权限修饰符
        Object value = name.get(s);
        System.out.println(value);

        //修改对象里面记录的值
        name.set(s, "lisi");
        System.out.println(s);
    }
}
